package com.dashu.device.netty.handler;


import com.dashu.base.enums.device.ModuleType;
import com.dashu.device.container.CQContainer;
import com.dashu.device.netty.ipml.CQServerImpl;
import io.netty.buffer.ByteBuf;
import io.netty.channel.ChannelHandlerContext;
import io.netty.channel.ChannelInboundHandlerAdapter;
import lombok.extern.slf4j.Slf4j;

import java.nio.charset.Charset;

import static com.dashu.device.container.CQContainer.CQonlineObj;
import static com.dashu.device.container.CQContainer.CQonlineStr;


@Slf4j
public class CQServerHandler extends ChannelInboundHandlerAdapter {


    private ModuleType moduleType;

    public CQServerHandler(ModuleType moduleType) {
        this.moduleType = moduleType;
    }

    /*
     * channelAction
     *
     * channel 通道 action 活跃的
     *
     * 当客户端主动链接服务端的链接后，这个通道就是活跃的了。也就是客户端与服务端建立了通信通道并且可以传输数据
     *
     */
    public void channelActive(ChannelHandlerContext ctx) throws Exception {
        System.out.println(ctx.channel().localAddress().toString() + " 通道已激活！");
    }

    /*
     * channelInactive
     *
     * channel 通道 Inactive 不活跃的
     *
     * 当客户端主动断开服务端的链接后，这个通道就是不活跃的。也就是说客户端与服务端的关闭了通信通道并且不可以传输数据
     *
     */
    public void channelInactive(ChannelHandlerContext ctx) throws Exception {
        System.out.println(ctx.channel().localAddress().toString() + " 通道不活跃！");
        log.info("CloudServerHandler.exceptionCaught:" + ctx.channel().localAddress().toString() + " 通道不活跃！");
        // 关闭流
        removeDevice(ctx);
    }


    /**
     * 功能：读取服务器发送过来的信息
     */
    @Override
    public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception {
        // 第一种：接收字符串时的处理
        ByteBuf buf = (ByteBuf) msg;
        if (buf.isReadable()) {
            byte[] con = new byte[buf.readableBytes()];
            buf.readBytes(con);
            String mes = new String(con, Charset.forName("utf-8"));
            new CQServerImpl(mes, ctx, moduleType);
        }
        buf.release();

    }

    /**
     * 功能：服务端发生异常的操作
     */
    @Override
    public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) throws Exception {
        cause.printStackTrace();
        System.out.println("异常信息：\r\n" + cause.toString());
        log.error("CloudServerHandler.exceptionCaught", cause);

        System.out.println(ctx.channel().localAddress().toString() + " 通道不活跃！");
        log.info("CloudServerHandler.exceptionCaught:" + ctx.channel().localAddress().toString() + " 通道不活跃！");

        removeDevice(ctx);
    }

    /**
     * 判断客户端是否掉线
     *
     * @param deviceUUID
     * @return
     */
    public static ChannelHandlerContext isConnect(String deviceUUID) {
//        CtxBean deviceInfo = cqQueue.get(deviceUUID);
//        if (deviceInfo == null)
//            return null;
//        ChannelHandlerContext ctx = deviceInfo.getCtx();
//        if (ctx != null && ctx.channel().isActive() && ctx.channel().isOpen())
//            return ctx;
//        else
        return null;
    }

    /**
     * 移除设备
     *
     * @param ctx
     */
    public static void removeDevice(ChannelHandlerContext ctx) {
        CQonlineStr.remove(CQonlineObj.get(ctx));
        CQonlineObj.remove(ctx);

        // 关闭流
//        for (String key : cqQueue.keySet()){
//            if (cqQueue.get(key) != null && cqQueue.get(key).getCtx() == ctx){
//                CtxBean ctxBean = cqQueue.get(key);
//                //移除设备心跳
//                cqHeart.remove(key);
//
//                //回调设备掉线心跳
//                DeviceHeartResp heartBean2 = new DeviceHeartResp();
//                heartBean2.setDeviceUUID(key);
//                heartBean2.setHeartType(HeartType.UNLINE);
//
//                for (ServerRespEnum serverResp : ServerRespEnum.values()) {
//                    if (serverResp.getModuleType() == ctxBean.getModuleType()) {
//                        try {
//                            BaseResp baseResp = serverResp.handleDeviceHeart(heartBean2, heartBean2.toString());
//                            if (baseResp == null)
//                                return;
//                            log.info("heart:" + baseResp.toString());
//                        } catch (Exception e) {
//                            log.error("heart", e);
//                        }
//                    }
//                }
//                log.info("关闭終端:" + key);
//                boolean isresult = cqQueue.remove(key , cqQueue.get(key));
//                ctx.channel().close();
//                log.info("关闭終端:" + isresult);
        return;
//            }
//        }
//        ctx.channel().close();
    }
}
